package billrestauration.controllers;

import java.util.ArrayList;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import billrestauration.daos.ExtraDao;
import billrestauration.daos.MainDao;
import billrestauration.entities.Menu;
import billrestauration.entities.Reservation;
import billrestauration.entities.Utilisateur;
import billrestauration.extra.validation.BillRestaurationValidator;
import billrestauration.secrity.encoder.PasswordEncoder;

@Controller
public class UtilisateurController {
	@Autowired(required=true)
	private MainDao dao;
	@Autowired(required=true)
	private PasswordEncoder encoder;
	@Autowired(required=true)
	private ExtraDao daobis;
	@Autowired(required=true)
	private BillRestaurationValidator validator;
	@RequestMapping(value="/login",method=RequestMethod.GET)
public String  login(){
	return "login";
}
	@RequestMapping(value="/loginfail",method=RequestMethod.GET)
	public String loginfail(){
		daobis.loadUserByUsername("kenzo");
		return "loginfail";
	}
	@RequestMapping(value="/espacemembre",method=RequestMethod.GET)
	public String espacemembre(Model model){
		 Authentication auth = SecurityContextHolder.getContext().getAuthentication();
	      String name = auth.getName(); //get logged in username
	 
		model.addAttribute("mesreservations", dao.listeReservationByUser(name));
		model.addAttribute("utilisateur", dao.loadUserByUsername(name));
		return "espacemembre";
	}
	@RequestMapping(value="/annulerreservation/{id}",method=RequestMethod.GET)
	public String annulerreservation(@PathVariable("id") Long id,Model model){
		Reservation r=dao.findReservationById(id);
		
		 if(null!=r){
			 r.getMenureserve().incQuantite();
			 r.setStatus(Reservation.ANNULEE);
			 dao.addReservation(r);
		 }
		 return espacemembre(model);
	}
	@RequestMapping(value="/annulerreservation/activerreservation/{id}",method=RequestMethod.GET)
	public String activerreservation(@PathVariable("id") Long id,Model model){
		Reservation r=dao.findReservationById(id);
		
		 if(null!=r){
			 r.getMenureserve().decQuantite();
			 r.setStatus(Reservation.EN_COURS);
			 dao.addReservation(r);
		 }
		 return espacemembre(model);
	}
	@RequestMapping(value="/annulerreservation/activerdenouveau/{id}",method=RequestMethod.GET)
	public String activerdenouveau(@PathVariable("id") Long id,Model model){
		Reservation r=dao.findReservationById(id);
		
		 if(null!=r){
			 r.getMenureserve().decQuantite();
			 r.setStatus(Reservation.EN_COURS);
			 dao.addReservation(r);
		 }
		 return espacemembre(model);
	}
	    
	@RequestMapping(value="/inscription",method=RequestMethod.GET)
	public String inscription(Model model){
		if(!model.containsAttribute("utilisateur"))
		model.addAttribute("utilisateur", new Utilisateur());
		ArrayList<String> country=new ArrayList<String>();country.add("Afghanistan");country.add("Afrique du Sud");country.add("Albanie");country.add("Algérie");country.add("Allemagne");country.add("Andorre");country.add("Angola");country.add("Anguilla");country.add("Antarctique");country.add("Antigua-et-Barbuda");country.add("Antilles Néerlandaises");country.add("Arabie Saoudite");country.add("Argentine");country.add("Arménie");country.add("Aruba");country.add("Australie");country.add("Autriche");country.add("Azerbaïdjan");country.add("Bahamas");country.add("Bahreïn");country.add("Bangladesh");country.add("Barbade");country.add("Belgique");country.add("Bélize");country.add("Bénin");country.add("Bermudes");country.add("Bhoutan");country.add("Biélorussie");country.add("Bolivie");country.add("Bosnie-Herzégovine");country.add("Botswana");country.add("Brésil");country.add("Brunei");country.add("Bulgarie");country.add("Burkina Faso");country.add("Burundi");country.add("Cambodge");country.add("Cameroun");country.add("Canada");country.add("Cap-Vert");country.add("Centrafrique");country.add("Chili");country.add("Chine");country.add("Chypre");country.add("Colombie");country.add("Comores");country.add("Congo");country.add("Corée du nord");country.add("Corée du sud");country.add("Costa Rica");country.add("Côte d'Ivoire");country.add("Croatie");country.add("Cuba");country.add("Danemark");country.add("Djibouti");country.add("Dominique");country.add("Égypte");country.add("Émirats arabes unis");country.add("Équateur");country.add("Érythrée");country.add("Espagne");country.add("Estonie");country.add("États-Unis");country.add("Éthiopie");country.add("Fidji");country.add("Finlande");country.add("France");country.add("Gabon");country.add("Gambie");country.add("Géorgie");country.add("Georgie du Sud et les iles Sandwich du Sud");country.add("Ghana");country.add("Gibraltar");country.add("Grèce");country.add("Grenade");country.add("Groenland");country.add("Guadeloupe");country.add("Guam");country.add("Guatémala");country.add("Guernesey");country.add("Guinée");country.add("Guinée-Bissau");country.add("Guinée-Équatoriale");country.add("Guyana");country.add("Guyane");country.add("Haïti");country.add("Honduras");country.add("Hong Kong");country.add("Hongrie");country.add("Ile Bouvet");country.add("Île Christmas");country.add("Île de la Réunion");country.add("Île de Man");country.add("Île Norfolk");country.add("Iles Aland");country.add("Îles Caïmans");country.add("Îles Cocos");country.add("Îles Cook");country.add("Îles Féroé");country.add("Îles Malouines");country.add("Îles Mariannes");country.add("Îles Pitcairn");country.add("Îles Salomon");country.add("Îles Vierges britanniques");country.add("Îles Vierges des États-Unis");country.add("Inde");country.add("Indonésie");country.add("Irak");country.add("Iran");country.add("Irlande");country.add("Islande");country.add("Israël");country.add("Italie");country.add("Jamaïque");country.add("Japon");country.add("Jersey");country.add("Jordanie");country.add("Kazakhstan");country.add("Kenya");country.add("Kirghizstan");country.add("Kiribati");country.add("Koweït");country.add("Laos");country.add("Lesotho");country.add("Lettonie");country.add("Liban");country.add("Liberia");country.add("Libye");country.add("Liechtenstein");country.add("Lituanie");country.add("Luxembourg");country.add("Macao");country.add("Macédoine");country.add("Madagascar");country.add("Malaisie");country.add("Malawi");country.add("Maldives");country.add("Mali");country.add("Malte");country.add("Maroc");country.add("Marshall");country.add("Martinique");country.add("Maurice");country.add("Mauritanie");country.add("Mayotte");country.add("Mexique");country.add("Micronésie");country.add("Moldavie");country.add("Monaco");country.add("Mongolie");country.add("Monténégro");country.add("Montserrat");country.add("Mozambique");country.add("Myanmar");country.add("Namibie");country.add("Nauru");country.add("Népal");country.add("Nicaragua");country.add("Niger");country.add("Nigéria");country.add("Niue");country.add("Norvège");country.add("Nouvelle-Calédonie");country.add("Nouvelle-Zélande");country.add("Oman");country.add("Ouganda");country.add("Ouzbékistan");country.add("Pakistan");country.add("Palaos");country.add("Panama");country.add("Papouasie-Nouvelle-Guinée");country.add("Paraguay");country.add("Pays-Bas");country.add("Pérou");country.add("Philippines");country.add("Pologne");country.add("Polynésie Française");country.add("Portugal");country.add("Puerto Rico");country.add("Qatar");country.add("République démocratique du Congo");country.add("République dominicaine");country.add("République tchèque");country.add("Roumanie");country.add("Royaume-Uni");country.add("Russie");country.add("Rwanda");country.add("Sahara Occidental");country.add("Saint Barthélémy");country.add("Saint-Hélène");country.add("Saint-Kitts-et-Nevis");country.add("Saint-Marin");country.add("Saint-Martin");country.add("Saint-Pierre-et-Miquelon");country.add("Saint-Vincent-et-les-Grenadines");country.add("Sainte-Lucie");country.add("Salvador");country.add("Samoa");country.add("Samoa Américaines");country.add("São Tomé-et-Príncipe");country.add("Sénégal");country.add("Serbie");country.add("Seychelles");country.add("Sierra Leone");country.add("Singapour");country.add("Slovaquie");country.add("Slovénie");country.add("Somalie");country.add("Soudan");country.add("Sri Lanka");country.add("Suède");country.add("Suisse");country.add("Suriname");country.add("Svalbard et Jan Mayen");country.add("Swaziland");country.add("Syrie");country.add("Tadjikistan");country.add("Taïwan");country.add("Tanzanie");country.add("Tchad");country.add("Thaïlande");country.add("Timor oriental");country.add("Togo");country.add("Tonga");country.add("Trinité-et-Tobago");country.add("Tunisie");country.add("Turkménistan");country.add("Turquie");country.add("Tuvalu");country.add("Ukraine");country.add("Uruguay");country.add("Vanuatu");country.add("Vatican");country.add("Venezuela");country.add("Viêtnam");country.add("Wallis et Futuna");country.add("Yémen");country.add("Zambie");country.add("Zimbabwe");
model.addAttribute("countries", country);
		return "inscription";
	}
	@RequestMapping(value="/inscription",method=RequestMethod.POST)
	public String inscriptiondo(Model model,@ModelAttribute(value="utilisateur") Utilisateur u,BindingResult result,Locale locale){
		model.addAttribute("utilisateur",u);
		try{
		validator.validate(u, result,locale);
		if(result.hasErrors()){
			return inscription(model);
		}
		 u.setSalt(encoder.getSalt());
		u.setPassword(encoder.encode(u.getPassword()));
		
		dao.addUser(u);
		dao.addRole("ROLE_USER", u);
		}catch(Exception e){
			model.addAttribute("erreurinscription", e.getMessage());
			return inscription(model);
		}
		
		return "inscriptionsuccess";
	}
	@RequestMapping(value="/modifiercompte",method=RequestMethod.POST)
	public String modifiercompte(Model model,@ModelAttribute(value="utilisateur") Utilisateur u){
		model.addAttribute("utilisateur",u);
		try{
		dao.update(u) ;
		}catch(Exception e){
			model.addAttribute("erreurmodification", e.getMessage());
			 
		}
		
		return "espacemembre";
	}
	
	
}
